package com.sicheng.蓝桥.省赛.十三届;

import java.util.Scanner;

/**
 * @author zsc
 * @version 1.0
 * @date 2022/5/19 13:23
 */
public class 统计子矩阵 {
    /**
     * 给定一个 N×M 的矩阵 A，请你统计有多少个子矩阵 (最小 1×1，最大 N×M)
     * 满足子矩阵中所有数的和不超过给定的整数 K?
     * 输入格式
     * 第一行包含三个整数 N,M 和 K。
     * <p>
     * 之后 N 行每行包含 M 个整数，代表矩阵 A。
     * <p>
     * 输出格式
     * 一个整数代表答案。
     * <p>
     * 数据范围
     * 对于 30% 的数据，N,M≤20，
     * 对于 70% 的数据，N,M≤100，
     * 对于 100% 的数据，1≤N,M≤500;0≤Aij≤1000;1≤K≤250000000。
     * <p>
     * 输入样例：
     * 3 4 10
     * 1 2 3 4
     * 5 6 7 8
     * 9 10 11 12
     * 输出样例：
     * 19
     * 样例解释
     * 满足条件的子矩阵一共有 19，包含：
     * <p>
     * 大小为 1×1 的有 10 个。
     * 大小为 1×2 的有 3 个。
     * 大小为 1×3 的有 2 个。
     * 大小为 1×4 的有 1 个。
     * 大小为 2×1 的有 3 个。
     */

    //大致思路
    //按照列的方向前缀和压缩
    //枚举任意两行(i,j) 纵向已经是一维,相当于降成一维数组,求连续子区间满足区间和<=k
    //二维纵向前缀和降维一维之后,就是滑动窗口求取

    /**
     * 纵向前缀和
     * 1 2 3 4 =============>1   2   3   4
     * 5 6 7 8               6   8   10  12
     * 9 10 11 12            15  18  21  24
     * <p>
     * 当列确定时,任意2行(i,j)的一维形式: num= a[j][r]-a[i-1][r]
     * <p>
     * 1 2 3 4       (1,1)的一维即前1行的纵向和
     * 6 8 10 12     (1,2)的一维即前2行的纵向和
     * 14 16 18 20   (2,3)的一维即第2行与第3行的纵向和
     */
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        int k = scanner.nextInt();

        int[][] a = new int[n + 2][m + 2];
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                a[i][j] = scanner.nextInt();
            }
        }

        //按列压缩
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                a[j][i] += a[j - 1][i];
            }
        }


        long count = 0;
        // 对行枚举(i,j)
        int[] nums = new int[m + 2];
        for (int i = 1; i <= n; i++) {
            for (int j = i; j <= n; j++) {
                int sum = 0;
                int l = 1;
                int r;

                // l窗口左端，r窗口右端,滑动时窗口内的和满足<=k
                for (r = 1; r <= m; r++) {
                    nums[r] = a[j][r] - a[i - 1][r];
                }
                for (r = 1; r <= m; r++) {
                    sum += nums[r];
                    while (sum > k) {
                        sum -= nums[l];
                        l++;
                    }
                    count += r - l + 1;
                }
            }
        }

        System.out.println(count);
    }
}
